/* Ingeniería - Nuevo plano componente patrón */

package edu.client;

import java.util.LinkedList;
import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;

import edu.client.IngenieriaService.IngenieriaService;
import edu.client.IngenieriaService.IngenieriaServiceAsync;
import edu.shared.DTO.ComponentePatronDTO;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;

public class P_NuevoPlanoComponentePatron extends Composite {
	
	private String tituloTab;
	TabPanel padre;
	
	TextBox codigoTB;
	TextBox nombreTB;
	TextBox claseEquipoTB;
	TextBox subclaseEquipoTB;
	TextBox componenteTB;
	TextBox subcomponenteTB;
	TextArea descripcionTecnicaTA;
	TextBox puntoPedidoTB;
	TextBox loteTB;
	TextBox planoTB;
	TextBox ultimaVersionTB;
	TextBox nuevoPlanoTB;
	TextBox versionNuevoPlanoTB;
	
	Button crearPlanoBtn;
	
	private IngenieriaServiceAsync ingenieriaService;

	private ComponentePatronDTO componentePatronBase;

	public P_NuevoPlanoComponentePatron (TabPanel padre, String tituloTab, String codigoComponentePatron) {
		
		this.tituloTab = tituloTab;
		this.padre = padre;
		ingenieriaService = GWT.create(IngenieriaService.class);
		
		LayoutPanel layoutPanel = new LayoutPanel();
		initWidget(layoutPanel);
		layoutPanel.setSize((Window.getClientWidth() - 55) + "px", "652px");
		
		/// SECCIÓN DETALLES COMPONENTE PATRÓN
		
		Label detallesComponenteLabel = new Label("DETALLES DEL COMPONENTE PATRÓN");
		detallesComponenteLabel.setStyleName("labelTitulo");
		layoutPanel.add(detallesComponenteLabel);
		layoutPanel.setWidgetLeftWidth(detallesComponenteLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(detallesComponenteLabel, 15.0, Unit.PX, 50.0, Unit.PX);
		
		Label codigoLabel = new Label("CÓDIGO: ");
		codigoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		codigoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(codigoLabel);
		layoutPanel.setWidgetLeftWidth(codigoLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(codigoLabel, 80.0, Unit.PX, 19.0, Unit.PX);
		
		codigoTB = new TextBox();
		layoutPanel.add(codigoTB);
		layoutPanel.setWidgetLeftWidth(codigoTB, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(codigoTB, 75.0, Unit.PX, 32.0, Unit.PX);
		codigoTB.setEnabled(false);
		
		Label nombreClaseLabel = new Label("CLASE DE EQUIPO: ");
		nombreClaseLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		nombreClaseLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(nombreClaseLabel);
		layoutPanel.setWidgetLeftWidth(nombreClaseLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(nombreClaseLabel, 125.0, Unit.PX, 19.0, Unit.PX);
		
		claseEquipoTB = new TextBox();
		layoutPanel.add(claseEquipoTB);
		layoutPanel.setWidgetLeftWidth(claseEquipoTB, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(claseEquipoTB, 120.0, Unit.PX, 32.0, Unit.PX);
		claseEquipoTB.setEnabled(false);
		
		Label subclaseEquipoLabel = new Label("SUBCLASE DE EQUIPO:");
		subclaseEquipoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		subclaseEquipoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(subclaseEquipoLabel);
		layoutPanel.setWidgetLeftWidth(subclaseEquipoLabel, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(subclaseEquipoLabel, 125.0, Unit.PX, 19.0, Unit.PX);
		
		subclaseEquipoTB = new TextBox();
		layoutPanel.add(subclaseEquipoTB);
		layoutPanel.setWidgetLeftWidth(subclaseEquipoTB, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(subclaseEquipoTB, 120.0, Unit.PX, 32.0, Unit.PX);
		subclaseEquipoTB.setEnabled(false);
		
		Label componenteLabel = new Label("COMPONENTE: ");
		componenteLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		componenteLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(componenteLabel);
		layoutPanel.setWidgetLeftWidth(componenteLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(componenteLabel, 175.0, Unit.PX, 19.0, Unit.PX);
		
		componenteTB = new TextBox();
		layoutPanel.add(componenteTB);
		layoutPanel.setWidgetLeftWidth(componenteTB, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(componenteTB, 170.0, Unit.PX, 32.0, Unit.PX);
		componenteTB.setEnabled(false);
		
		Label subcomponenteLabel = new Label("SUBCOMPONENTE: ");
		subcomponenteLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		subcomponenteLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(subcomponenteLabel);
		layoutPanel.setWidgetLeftWidth(subcomponenteLabel, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(subcomponenteLabel, 175.0, Unit.PX, 19.0, Unit.PX);
		
		subcomponenteTB = new TextBox();
		layoutPanel.add(subcomponenteTB);
		layoutPanel.setWidgetLeftWidth(subcomponenteTB, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(subcomponenteTB, 170.0, Unit.PX, 32.0, Unit.PX);
		subcomponenteTB.setEnabled(false);
		
		Label planoLabel = new Label("PLANO: ");
		planoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		planoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(planoLabel);
		layoutPanel.setWidgetLeftWidth(planoLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(planoLabel, 225.0, Unit.PX, 19.0, Unit.PX);
		
		planoTB = new TextBox();
		layoutPanel.add(planoTB);
		layoutPanel.setWidgetLeftWidth(planoTB, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(planoTB, 220.0, Unit.PX, 32.0, Unit.PX);
		planoTB.setEnabled(false);
		
		Label ultimaVersionLabel = new Label("ÚLTIMA VERSIÓN: ");
		ultimaVersionLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		ultimaVersionLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(ultimaVersionLabel);
		layoutPanel.setWidgetLeftWidth(ultimaVersionLabel, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(ultimaVersionLabel, 225.0, Unit.PX, 19.0, Unit.PX);
		
		ultimaVersionTB = new TextBox();
		layoutPanel.add(ultimaVersionTB);
		layoutPanel.setWidgetLeftWidth(ultimaVersionTB, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(ultimaVersionTB, 220.0, Unit.PX, 32.0, Unit.PX);
		ultimaVersionTB.setEnabled(false);
		
		///
		
		/// SECCIÓN DETALLES DE NUEVO PLANO
		
		Label detallesNuevoPlanoLabel = new Label("DETALLES DEL NUEVO PLANO");
		detallesNuevoPlanoLabel.setStyleName("labelTitulo");
		layoutPanel.add(detallesNuevoPlanoLabel);
		layoutPanel.setWidgetLeftWidth(detallesNuevoPlanoLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(detallesNuevoPlanoLabel, 260.0, Unit.PX, 50.0, Unit.PX);
		
		Label nuevoPlanoLabel = new Label("NUEVO PLANO: ");
		nuevoPlanoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		nuevoPlanoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(nuevoPlanoLabel);
		layoutPanel.setWidgetLeftWidth(nuevoPlanoLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(nuevoPlanoLabel, 330.0, Unit.PX, 19.0, Unit.PX);
		
		nuevoPlanoTB = new TextBox();
		layoutPanel.add(nuevoPlanoTB);
		layoutPanel.setWidgetLeftWidth(nuevoPlanoTB, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(nuevoPlanoTB, 325.0, Unit.PX, 32.0, Unit.PX);
		nuevoPlanoTB.setEnabled(false);
		
		Label versionLabel = new Label("VERSIÓN:");
		versionLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		versionLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(versionLabel);
		layoutPanel.setWidgetLeftWidth(versionLabel, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(versionLabel, 330.0, Unit.PX, 19.0, Unit.PX);
		
		versionNuevoPlanoTB = new TextBox();
		layoutPanel.add(versionNuevoPlanoTB);
		layoutPanel.setWidgetLeftWidth(versionNuevoPlanoTB, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(versionNuevoPlanoTB, 325.0, Unit.PX, 32.0, Unit.PX);
		versionNuevoPlanoTB.setEnabled(false);
		versionNuevoPlanoTB.setText("M0");
		
		Label descripcionTecnicaLabel = new Label("DESCRIPCIÓN TÉCNICA:");
		descripcionTecnicaLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		descripcionTecnicaLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(descripcionTecnicaLabel);
		layoutPanel.setWidgetLeftWidth(descripcionTecnicaLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(descripcionTecnicaLabel, 420.0, Unit.PX, 19.0, Unit.PX);
		
		descripcionTecnicaTA = new TextArea();
		layoutPanel.add(descripcionTecnicaTA);
		layoutPanel.setWidgetLeftWidth(descripcionTecnicaTA, 17.5, Unit.PCT, 77.5, Unit.PCT);
		layoutPanel.setWidgetTopHeight(descripcionTecnicaTA, 380.0, Unit.PX, 100.0, Unit.PX);
		
		Label puntoPedidoLabel = new Label("PUNTO DE PEDIDO:");
		puntoPedidoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		puntoPedidoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(puntoPedidoLabel);
		layoutPanel.setWidgetLeftWidth(puntoPedidoLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(puntoPedidoLabel, 500.0, Unit.PX, 19.0, Unit.PX);
		
		puntoPedidoTB = new TextBox();
		layoutPanel.add(puntoPedidoTB);
		layoutPanel.setWidgetLeftWidth(puntoPedidoTB, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(puntoPedidoTB, 495.0, Unit.PX, 32.0, Unit.PX);
		
		Label loteLabel = new Label("LOTE:");
		loteLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		loteLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(loteLabel);
		layoutPanel.setWidgetLeftWidth(loteLabel, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(loteLabel, 500.0, Unit.PX, 19.0, Unit.PX);
		
		loteTB = new TextBox();
		layoutPanel.add(loteTB);
		layoutPanel.setWidgetLeftWidth(loteTB, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(loteTB, 495.0, Unit.PX, 32.0, Unit.PX);
		
		///
		
		/// SECCIÓN PIE
		
		Label pieLabel = new Label("");
		pieLabel.setStyleName("labelTitulo");
		layoutPanel.add(pieLabel);
		layoutPanel.setWidgetLeftWidth(pieLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetBottomHeight(pieLabel, 60.0, Unit.PX, 50.0, Unit.PX);
		
		crearPlanoBtn = new Button("CREAR");
		layoutPanel.add(crearPlanoBtn);
		layoutPanel.setWidgetRightWidth(crearPlanoBtn, 17.5, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetBottomHeight(crearPlanoBtn, 4.0, Unit.PCT, 28.0, Unit.PX);
		
		// al hacer clic sobre el botón CREAR PLANO DE COMPONENTE PATRÓN
		crearPlanoBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				
				crearPlanoBtn.setEnabled(false);
				
				List<String> errores = new LinkedList<String>();
				String mensaje = "";

				errores = validarDatos();
				
				// si hubo errores, se arma el mensaje y se alerta al usuario.
				if(errores.size() > 0) {
					
					mensaje = mensaje + errores.get(0);
					
					for(int i=1; i<errores.size(); i++) {
						mensaje = mensaje + '\n' + '\n' + errores.get(i);
					}
					
					Window.alert(mensaje);
					crearPlanoBtn.setEnabled(true);
				}
				
				// si no hubo ningún error, se procede a registrar el componente.
				else {								
					registrarComponentePatronNuevoPlano();					
				}				
			}
		});
		
		
		Button cancelarBtn = new Button("CANCELAR");
		layoutPanel.add(cancelarBtn);
		layoutPanel.setWidgetRightWidth(cancelarBtn, 5.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetBottomHeight(cancelarBtn, 4.0, Unit.PCT, 28.0, Unit.PX);
			
		cancelarBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				cancelar(event);
			}
		});
		
		///
		
		/// CARGA DE PANTALLA
		
		// carga del equipo patrón
		cargarComponentePatron(codigoComponentePatron);
		//
		
		///
		
	}
	
	private void cargarComponentePatron (String codigoComponenteSeleccionado) {
		
		// se desglosa el código
		int codigoClase = Integer.parseInt(codigoComponenteSeleccionado.substring(0, 2));
		int codigoSubclase = Integer.parseInt(codigoComponenteSeleccionado.substring(2, 4));
		int codigoComponente = Integer.parseInt(codigoComponenteSeleccionado.substring(8, 10));
		int codigoSubcomponente = Integer.parseInt(codigoComponenteSeleccionado.substring(10, 12));
		
		final int plano = Integer.parseInt(codigoComponenteSeleccionado.substring(13, 15));
		
		// se buscan todos los planos en su última versión, activos e inactivos, para ese componente o subcomponente patrón.
		ingenieriaService.buscarComponentesPatronUltimaVersion(codigoClase, codigoSubclase, codigoComponente, codigoSubcomponente, new AsyncCallback<List<ComponentePatronDTO>>() {
			
			@Override
			public void onSuccess(List<ComponentePatronDTO> listaComponentes) {

				ComponentePatronDTO componenteSeleccionado = new ComponentePatronDTO();
				
				// se busca el plano correspondiente
				for (ComponentePatronDTO c: listaComponentes) {
					
					if (c.getPlano() == plano) {
						componenteSeleccionado = c;
						break;
					}
				}
								
				componentePatronBase = componenteSeleccionado;

				// código del equipo
				codigoTB.setText(Validaciones.rellenarCodigoComponentePatron(componenteSeleccionado));
				
				// clase
				claseEquipoTB.setText(componenteSeleccionado.getNombreClase());
				
				// subclase
				subclaseEquipoTB.setText(componenteSeleccionado.getNombreSubclase());
				
				// si se trata de un componente
				if (componenteSeleccionado.getCodigoSubcomponente() == 0) {
					
					// nombre componente
					componenteTB.setText(componenteSeleccionado.getNombre());
				}
				
				// si se trata de un subcomponente
				else {
					
					// nombre subcomponente
					subcomponenteTB.setText(componenteSeleccionado.getNombre());
				}				
				
				// plano
				// se da formato al número de plano.
				String plano = (String) (componenteSeleccionado.getPlano() < 10 ? "0" + componenteSeleccionado.getPlano() : componenteSeleccionado.getPlano());
				planoTB.setText(plano);
				
				// versión
				ultimaVersionTB.setText(componenteSeleccionado.getNroVersion());
				
				// se calcula el siguiente número de plano								
				int siguienteNroPlano = siguienteNroPlano(listaComponentes);				
				
				// se setea el número del nuevo plano al componente patrón base.
				componentePatronBase.setPlano(siguienteNroPlano);	
				
				// nuevo plano
				String nuevoPlano = (String) (siguienteNroPlano < 10 ? "0" + siguienteNroPlano : siguienteNroPlano);
				nuevoPlanoTB.setText(nuevoPlano);
				
				// descripción técnica (editable)
				if (componentePatronBase.getDescripcionTecnica() != null) {
					descripcionTecnicaTA.setText(componentePatronBase.getDescripcionTecnica());
				}
				
				// punto de pedido (editable)
				if (componentePatronBase.getPuntoPedido() != null) {
					puntoPedidoTB.setText(String.valueOf(componentePatronBase.getPuntoPedido()));
				}
								
				// lote (editable)
				if (componentePatronBase.getLote() != null) {
					loteTB.setText(String.valueOf(componentePatronBase.getLote()));
				}
			}

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
			}	
		});	
	}
	
	/** 
	 * Método que registra el nuevo plano de componente patrón especificado en la pantalla.
	 */
	private void registrarComponentePatronNuevoPlano() {
		
		// se setean los datos del nuevo plano, tomando como base al componente patrón seleccionado.
				
		// el idComponente sigue siendo el del componente base (se utilizará dps para buscar los renglones de la lista de materiales del componente base)
		
		componentePatronBase.setDescripcionTecnica(descripcionTecnicaTA.getText());
		
		if (puntoPedidoTB.getText().equals("")) {
			componentePatronBase.setPuntoPedido(null);
		}
		else {
			componentePatronBase.setPuntoPedido(Integer.valueOf(puntoPedidoTB.getText()));
		}
		
		componentePatronBase.setActivo(true);
				
		if (loteTB.getText().equals("")) {
			componentePatronBase.setLote(null);
		}
		else {
			componentePatronBase.setLote(Integer.valueOf(loteTB.getText()));
		}

		// se setea la cantidad disponible en 0.
		componentePatronBase.setCantidadDisponible(0);
		// se setea la versión a M0.
		componentePatronBase.setNroVersion("M0");
		
		// se intenta hacer el registro del nuevo plano de componente patrón
		ingenieriaService.registrarComponentePatronNuevoPlanoOVersion(componentePatronBase, new AsyncCallback<ComponentePatronDTO>() {

			@Override
			public void onSuccess(ComponentePatronDTO componenteCreado) {
				
				if (componenteCreado != null) {
										
					String codigoComponentePatron = Validaciones.rellenarCodigoComponentePatron(componenteCreado);
					
					Window.alert("El nuevo plano de componente patrón ha sido creado de manera exitosa.\nCódigo componente patrón: " + codigoComponentePatron);
					salir();
					
				} 
				
				else{
					
					Window.alert("No se ha podido crear el nuevo plano de componente patrón especificado.");
					crearPlanoBtn.setEnabled(true);
				}
			}

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
				crearPlanoBtn.setEnabled(true);
			}
		});			
	}
	
	/**
	 * Método que calcula el siguiente número de plano a utilizar
	 * @param listaComponentesPatron
	 * @return siguiente número de plano
	 */
	private int siguienteNroPlano(List<ComponentePatronDTO> listaComponentesPatron) {
		
		int mayorNroPlano = -1;
		
		for(ComponentePatronDTO c: listaComponentesPatron) {
			
			if (c.getPlano() > mayorNroPlano) {
				mayorNroPlano = c.getPlano();
			}
		}

		return mayorNroPlano + 1;
	}
	
	/**
	 * Método que valida los datos ingresados por el usuario y devuelve una lista con los errores encontrados.
	 * @return lista de errores.
	 */
	private List<String> validarDatos() {
		
		List<String> listaErrores = new LinkedList<String>();

		// se verifica que el lote sea un número entero positivo, cero, o vacío.
		if (!loteTB.getText().equals("")) {
			
			try {				
				int lote = Integer.parseInt(loteTB.getText());
				
				// si el lote es menor a cero.
				if (lote < 0) {
					throw new Exception();
				}
			}
			
			catch (Exception e) {
				listaErrores.add("- El lote sólo puede ser un número entero positivo, cero, o bien quedar vacío.");			
			}
		}
		
		// se verifica que el punto de pedido sea un número entero positivo, cero, o vacío.
		if (!puntoPedidoTB.getText().equals("")) {
			
			try {
				int puntoPedido = Integer.parseInt(puntoPedidoTB.getText());
				
				if (puntoPedido < 0) {
					throw new Exception();
				}
			}
			
			catch (Exception e) {
				listaErrores.add("- El punto de pedido sólo puede ser un número entero positivo, cero, o bien quedar vacío.");
			}
		}
				
		return listaErrores;
	}
	
	/**
	 * Método que vuelve a la pantalla inmediatamente anterior a la presente.
	 * @param event
	 */
	public void cancelar(ClickEvent event) {
					
		int ancho = Window.getClientWidth() - 15;
		int alto = Window.getClientHeight() - 13;
		
		P_NuevoPlanoComponentePatronSeleccion pNuevoPlanoComponentePatron = new P_NuevoPlanoComponentePatronSeleccion(padre, tituloTab);
		
		this.getParent().removeFromParent();
		ScrollPanel formulario = new ScrollPanel();
		formulario.setTitle(tituloTab);
		formulario.setStyleName("panelFormulario");
		formulario.setSize((ancho - 25) + "px", (alto - 145) + "px");
		formulario.add(pNuevoPlanoComponentePatron);
		padre.add(formulario, tituloTab, false);
		padre.selectTab(Validaciones.numeroElemento(padre, tituloTab));
		
		padre.setSize((ancho - 5) + "px", (alto - 90) + "px");

		for(int i = 0; i < padre.getWidgetCount(); i++) {
			padre.getWidget(i).setSize((ancho - 20) + "px", (alto - 145) + "px");
		}
	}
	
	public void salir() {
		padre.remove(Validaciones.numeroElemento(padre, tituloTab));
	}
}
